Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Singleton a klasa "statyczna"
y3ti
post
Post #21





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 19.08.2004
Skąd: Pruszków

Ostrzeżenie: (0%)
-----


Pokombinowałem troszkę i...

1. Klasa statyczna nie może posiadać konstruktora (destruktor działa), więc nie jesteśmy w stanie kontrolować procesu tworzenia instancji klasy

2. Korzystając z klas statycznych możemy zapomnieć o polimorfizmie. Musimy przekazać instancje klasy do metody - w klasie statycznej nie tworzymy instancji

Klasy statyczne dobrze się sprawdzają jako fabryki.
Go to the top of the page
+Quote Post
Jarod
post
Post #22





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


Cytat(y3ti @ 26.12.2006, 12:34:23 ) *
Pokombinowałem troszkę i...

1. Klasa statyczna nie może posiadać konstruktora (destruktor działa), więc nie jesteśmy w stanie kontrolować procesu tworzenia instancji klasy


A po co chcesz tworzyć instancję klasy statycznej? (IMG:http://forum.php.pl/style_emoticons/default/blink.gif)
Go to the top of the page
+Quote Post
hwao
post
Post #23


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




y3ti tłumaczy wam absurd jaki przedstawiliście, mianowicie:

"singleton to taki nie potrzebny bajer, lepsza klasa statyczna".

Jak ktoś nie widzi różnicy, potrzeby to niech nie korzysta z singletona. Jest to jeden z najpopularniejszych wzorców i najczęściej stosowany.
Go to the top of the page
+Quote Post
menic
post
Post #24





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


Skoro nie widze róznicy to niech ktoś przedstawi róznice w praktyce, a nie tylko w teorii.
Go to the top of the page
+Quote Post
cadavre
post
Post #25





Grupa: Zarejestrowani
Postów: 472
Pomógł: 7
Dołączył: 7.12.2005
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


I jeśli
Cytat
Jest to jeden z najpopularniejszych wzorców i najczęściej stosowany.
to dlaczego? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
y3ti
post
Post #26





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 19.08.2004
Skąd: Pruszków

Ostrzeżenie: (0%)
-----


Załóżmy, że mamy klasę DB służącą do obsługi bazy danych oraz klasę DB_Mysql służącą do obsługi bazy MySQL. W rzeczywistym systemie klasa DB była by pewnie abstrakcyjna, ale załóżmy, że nasza klasa ma jakąś funkcjonalność (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Mamy też funkcję, która wykonuje jakąś operacje na na bazie danych. Do tego potrzebny jest jej obiekt klasy DB. Funkcja nie wie z jakiego silnika będziemy korzystać, więc po prostu prosi o obiekt typu DB.

Wersja statyczna:

  1. <?php
  2. class DB {
  3. public static function hello() {
  4. print 'Funkcja query klasy DB'; 
  5. }
  6. }
  7.  
  8. class DB_Mysql extends DB {
  9. public static function hello() {
  10. print 'Funkcja query klasy DB_Mysql';
  11. }
  12. }
  13.  
  14. //
  15. // Zalozmy, ze mamy funkcje, ktora wykonuje jakies zapytanie 
  16. // do bazy danych. Funkcja nie wie z jakiego silnika bazy danych
  17. // korzystamy, wiec korzystamy z dobrodziejstw polimorfizmu
  18. //
  19. function foo(DB $objDB) {
  20. $objDB->hello();
  21. }
  22.  
  23. //
  24. // Nie mozemy zrobic czegos takiego
  25. //
  26. foo(DB_Mysql);
  27. ?>


php wywali nam błąd, ponieważ funkcja foo() oczekuje instancji obiektu DB.

A teraz Singleton:

  1. <?php
  2. class DB {
  3. private static $instance;
  4.  
  5. private function __construct() {}
  6.  
  7. public static function getInstance() {
  8. if(empty(self::$instance)) 
  9. self::$instance = new DB();
  10.  
  11. return self::$instance;
  12. }
  13.  
  14. public static function hello() {
  15. print 'Funkcja query klasy DB'; 
  16. }
  17. }
  18.  
  19.  
  20. class DB_Mysql extends DB {
  21. private static $instance;
  22.  
  23. private function __construct() {}
  24.  
  25. public static function getInstance() {
  26. if(empty(self::$instance)) 
  27. self::$instance = new DB_Mysql();
  28.  
  29. return self::$instance;
  30. }
  31.  
  32. public static function hello() {
  33. print 'Funkcja query klasy DB_Mysql'; 
  34. }
  35. }
  36.  
  37. //
  38. // Zalozmy, ze mamy funkcje, ktora wykonuje jakies zapytanie 
  39. // do bazy danych. Funkcja nie wie z jakiego silnika bazy danych
  40. // korzystamy, wiec korzystamy z dobrodziejstw polimorfizmu
  41. //
  42. function foo(DB $objDB) {
  43. $objDB->hello();
  44. }
  45.  
  46. $db = DB::getInstance();
  47. foo($db); // wyswietli: Funkcja query klasy DB 
  48.  
  49. $db2 = DB_Mysql::getInstance();
  50. foo($db2); // wyswietli: Funkcja query klasy DB_Mysql
  51. ?>


Tak na szybko, tylko taki przykład przyszedł mi do głowy (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
menic
post
Post #27





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


Ok to takie pytanie. Do czego sie najbardziej przydają klasy statyczne?
Go to the top of the page
+Quote Post
y3ti
post
Post #28





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 19.08.2004
Skąd: Pruszków

Ostrzeżenie: (0%)
-----


Np. jako wzorzec fabryki

  1. <?php
  2.  $object = DB::factory('MySQL');
  3. ?>


Ten post edytował y3ti 29.12.2006, 12:23:40
Go to the top of the page
+Quote Post
hwao
post
Post #29


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




http://webcity.pl/webcity/artykuly.php/t/62
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #30





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


'Klasa statyczna' od Singletona rozni sie tylko (i az) tym ze nie jest obiektem, i inaczej sie zapisuje wywolania metod.
Go to the top of the page
+Quote Post
Athlan
post
Post #31





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

Ostrzeżenie: (0%)
-----


Na podstawie wzorca singletorn można stwożyć klasę rejestru, czyli zbiór konkretnych instancji klasy. Zazwyczaj złużą temu dwie metody:
Register() - rejestruje instancje klas
Registry() - wywołuje instancje klas z biblioteki singletonów

Singletony przechowywane są jako tablica w prywatnym statycznym atrybucie, jakoże w.w metody również są statyczne.

Trochę kodu wyciągniętego z mojego FW...

  1. <?php
  2.  
  3. final class Vframe
  4. {
  5. // ...
  6.  
  7. /**
  8.  * Object registry provides storage for shared objects
  9.  * @var array
  10.  */
  11. private static $_aRegistry = array();
  12.  
  13. // ...
  14.  
  15. /**
  16.  * Register a object as specified name
  17.  * If $sRegistryName is NULL, than name of registry will be name of declared cla
    ss
  18.  * 
  19.  * @see: registry()
  20.  * @throws: VframeException
  21.  * @param $oInstance  object : object witch will be push into registry array
  22.  * @param $sRegistryName string : name as registry object
  23.  * @access: public
  24.  * @return: void
  25.  */
  26. public static function register($oInstance, $sRegistryName = NULL)
  27. {
  28. if(!is_object($oInstance))
  29. throw new VframeException('Only objects may be stored in the registry!');
  30.  
  31. if($sRegistryName === NULL)
  32. $sRegistryName = get_class($oInstance);
  33.  
  34. if(!is_string($sRegistryName))
  35. throw new VframeException('Second parametr $sRegistryName must be a string!');
  36.  
  37. if(isset(self::$_aRegistry[$sRegistryName]))
  38. throw new VframeException('Registry "'.$sRegistryName.'" arleady exists! Did you mean to call registry()?');
  39.  
  40. self::$_aRegistry[$sRegistryName] = $oInstance;
  41. }
  42.  
  43. /**
  44.  * Get a single instance (singleton) from registry
  45.  * If $sInstanceName is NULL, than will be returned
  46.  * array of registereg objects
  47.  * 
  48.  * @see: register()
  49.  * @throws: VframeException
  50.  * @param $sInstanceName string : key of registry, witch will be return
  51.  * @access: public
  52.  * @return: object
  53.  */
  54. public static function registry($sInstanceName = NULL)
  55. {
  56. if($sInstanceName === NULL)
  57. {
  58. $sRegistryMap = array();
  59.  
  60. foreach(self::$_aRegistry as $sRegistryName => $oRegistryObject)
  61. {
  62. $sRegistryMap[$sRegistryName] = get_class($oRegistryObject);
  63. }
  64.  
  65. return $sRegistryMap;
  66. }
  67.  
  68. if(!is_string($sInstanceName))
  69. throw new VframeException('Param $sInstanceName must be a string!');
  70.  
  71. if(isset(self::$_aRegistry[$sRegistryName]))
  72. throw new VframeException('No object named as "$sInstanceName", use register() to insert it!');
  73.  
  74. return self::$_aRegistry[$sInstanceName];
  75. }
  76.  
  77. // ...
  78. }
  79.  
  80. ?>
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 1.09.2025 - 00:02